// 实现并发请求
var hrefs = {}
// 获取一个请求地址
function getRequest() {
    var request = {
        base: 'https://www.link.com',
        port: 8080,
        query: {
            name: 'link',
            num: () => Math.floor(Math.random() * 1000_000_000_000_000)
        },
        URL: () => {
            return `${request.base}:${request.port}/name=${request.query.name}&num=${request.query.num()}`
        }
    }
    function ret() {
        const req = request.URL()
        if (hrefs[`${req}`]) {
            ret()
        } else {
            hrefs[req] = 1
            return req
        }
    }
    return ret()
}
// 初始化并发请求列表
function startRequest(num) {
    var arr = new Array()
    this.num = num
    while (this.num-- > 0) arr.push(getRequest())
    return arr
}
// 执行请求 
const fn = (url, index) => {
    // 实际场景这里用axios等请求库 发请求即可 也不用设置延时
    return new Promise(resolve => {
        setTimeout(() => {
            resolve({ url, date: new Date(), index: index });
        }, 3000 )//Math.floor(Math.random() * 3 + 1));
    })
};
// 处理并发函数
function axiosCurrentList(startURL, maxcurrent = 3, nowcurrent) {
    // 初始请求 10个
    this.startURL = startURL
    // 当前并发数
    this.maxcurrent = maxcurrent
    // 最大并发数
    this.nowcurrent = nowcurrent
    // 是否继续请求
    this.isRequest = true
    this.index = 0
    for (let i = 0; i < this.startURL.length; i++) {
        run()
    }
    // 执行一个请求
    function run() {
        new Promise((resolve, reject) => {
            const url = startURL[this.index];
            if(this.index>=this.startURL.length){
                console.log(1);
                return
            }
            // console.log(resolve);
            // 传入url和index，完成一个删除一个，然后再加进来
            resolve(fn(url, this.index++))
        }).then(req => {
            console.log('完成一个任务', req.url, req.date)
            // this.startURL.splice(req.index - 1, 1)
            console.log(this.startURL.length);
            if (this.startURL.length < 1) {
                return;
            } else {
                run()
            }
        })
    }
}
// 初始请求 10个
const startURL = startRequest(10)
// 最大并发数
const maxcurrent = 3;
// 当前并发数
let nowcurrent = 3;
axiosCurrentList(startURL, maxcurrent, nowcurrent)
